﻿#include <iostream>

using namespace std;

//template <class T>
///*const T& */ void GetArg(const T& x)
//{
//	cout << x << " ";
//	//return x;
//}

//包扩展
////template <class ...Args>
////void Arguments(Args... args)
////{}
// 
//template <class ...Args>
//void Print(Args... args)
//{
//	//Arguments(GetArg(args)...);
//	(GetArg(args),...);
//	cout << endl;
//}
//
//int main()
//{
//	Print(1, string("xxxxx"), 2.2);
//
//	return 0;
//}


//template <class T>
//void func(const T& x )
//{
//	cout << x << " ";
//}
//
//template <class ...Args>
//void Print(Args... args)
//{
//	(func(args),...);
//	cout << endl;
//}
//
//int main()
//{
//	Print(1, string("xxxxx"), 2.2);
//	return 0;
//}

//template <class... Args> // Args 是一个模板参数包
//
//
//void func(Args... args)
//{
//	//...
//}


//template <class ...Args>
//void Print(Args&&... args)
//{
//	cout << sizeof...(args) << endl;
//}
//
//int main()
//{
//	double x = 2.2;
//	Print();						// 包里有0个参数
//	Print(1);						// 包里有1个参数
//	Print(1, string("xxxxx"));		// 包里有2个参数
//	Print(1.1, string("xxxxx"), x); // 包里有3个参数
//	return 0;
//}


//void Print()
//{
//	// 编译器时递归的终止条件，参数包是0个时，直接匹配这个函数
//	cout << endl;
//}
//// args是包含N个参数的参数包，调用Print，参数包的第一个传给x，剩下N-1传给第二个参数包
//template <class T, class ...Args>	// 编译时递归推导解析参数
//void Print(T x, Args... args)
//{
//	cout << x << " ";
//	Print(args...);
//}
//
//int main()
//{
//	Print(1, string("xxxxx"), 2.2);
//	return 0;
//}


//void Print()
//{
//	cout << endl;
//}
//void Print(double x)
//{
//	cout << x << " ";
//	Print();
//}
//void Print(string x, double y)
//{
//	cout << x << " ";
//	Print(y);
//}
//void Print(int x, string y, double z)
//{
//	cout << x << " ";
//	Print(y, z);
//}
//
//int main()
//{
//	Print(1, string("xxxxx"), 2.2);
//	return 0;
//}


//void ShowList()
//{
//	// 编译器时递归的终止条件，参数包是0个时，直接匹配这个函数
//	cout << endl;
//}
//// args是包含N个参数的参数包，调用ShowList，参数包的第⼀个传给x，剩下N-1传给第⼆个参数包
//template <class T, class ...Args>
//void ShowList(T x, Args... args)
//{
//	cout << x << " ";
//	ShowList(args...);
//}
//// 编译时递归推导解析参数
//template <class ...Args>
//void Print(Args... args)
//{
//	ShowList(args...);
//}
//int main()
//{
//	Print(1, string("xxxxx"), 2.2);
//	return 0;
//}


//lambda

//int main()
//{
//	auto add = [](int x, int y) ->int {return x + y; };
//	cout << add(11, 14) << endl;
//
//	// 1、捕捉为空也不能省略
//	// 2、参数为空可以省略
//	// 3、返回值可以省略，可以通过返回对象自动推导
//	// 4、函数体不能省略
//	auto func1 = []
//	{
//		cout << "How are you" << endl;
//		return 0;
//	};
//	func1();
//
//	return 0;
//}


//捕捉列表
//int main()
//{
//	int x = 1;
//	int y = 5;
//
//	auto func1 = [x, &y]()->void
//	{
//		cout << x + y << endl;
//	};
//
//	return 0;
//}

//传值捕捉和传引用捕捉
//int main()
//{
//	int x = 1;
//	int y = 5;
//
//	auto func1 = [x, &y] ()mutable ->void
//	{
//		x = 17;
//		cout << x << endl;
//	};
//
//	func1();
//	cout << x << endl;
//	return 0;
//}

// 隐式捕捉
//int main()
//{
//	int a = 1, b = 2, c = 3;
//
//	auto add1 = [=]()->int
//	{
//		return a + b + c;
//	};
//	cout << add1() << endl;
//
//	auto add2 = [&]()->int
//	{
//		return a + b;
//	};
//	cout << add2() << endl;
//
//	return 0;
//}


//int main()
//{
//	int x = 15;
//	auto change = [&x]()->void
//	{
//		x = 21;
//	};
//
//	change();
//	cout << x << endl;
//	return 0;
//}

//lambda的应用
//排序自定义比较函数

#include <vector>
#include <algorithm>

//class cmp
//{
//	bool operator()(int x, int y) { return x > y; }
//};
//
//int main()
//{
//	vector<int> v1({ 1,4,2,8,6,4 });
//	//仿函数控制降序
//	sort(v1.begin(), v1.end(), cmp());
//
//	for (auto& e : v1) cout << e << " ";
//	cout << endl;
//	return 0;
//}

//int main()
//{
//	//lambda
//	vector<int> v1({ 1,4,2,8,6,4 });
//	sort(v1.begin(), v1.end(), [](int x, int y) ->int 
//	{
//		return x > y;
//	});
//
//	for (auto& e : v1) cout << e << " ";
//	cout << endl;
//
//	return 0;
//}

//过滤元素

//int main()
//{
//	vector<int> nums1 = { 1, 2, 3, 4, 5 };
//	vector<int> nums2;
//	// 筛选偶数
//	copy_if(nums1.begin(), nums1.end(), back_inserter(nums2),
//		[](int num) { return num % 2 == 0; });		  
//
//	for (auto& e : nums2) cout << e << " ";
//	cout << endl;
//
//	return 0;
//}